package edu.software.PBL_Management_System.dto;

import com.fasterxml.jackson.annotation.JsonProperty;
import lombok.Data;

import java.util.List;
import java.util.Map;

/**
 * 聊天请求数据传输对象
 * 用于封装前端发送的聊天请求数据，并转发给Dify API
 * 
 */
public class ChatRequest {

    /**
     * 用户输入的查询内容/消息
     */
    private String query;
    /**
     * 输入参数映射，用于传递额外的上下文信息
     */
    private Map<String, Object> inputs;

    /**
     * 响应模式
     * "blocking" - 阻塞模式，等待完整响应
     * "streaming" - 流式模式，实时返回响应片段
     */
    @JsonProperty("response_mode") //将属性映射为JSON属性的注解
    private String responseMode = "blocking";

    /**
     * 用户标识符，用于区分不同用户的会话
     */
    private String user;

    /**
     * 会话ID，用于维持多轮对话的上下文
     * 空字符串表示新建会话
     */
    @JsonProperty("conversation_id")
    private String conversationId = "";

    /**
     * 附件文件列表，支持上传文档、图片等
     */
    private List<FileInfo> files;

    /**
     * 是否自动生成会话名称
     */
    @JsonProperty("auto_generate_name")
    private Boolean autoGenerateName = true;

    // ========== 构造函数 ==========

    /**
     * 默认构造函数
     */
    public ChatRequest() {
    }

    /**
     * 便捷构造函数
     * @param query 用户查询内容
     * @param user 用户标识
     */
    public ChatRequest(String query, String user) {
        this.query = query;
        this.user = user;
    }

    // ========== Getter 和 Setter 方法 ==========

    public String getQuery() {
        return query;
    }

    public void setQuery(String query) {
        this.query = query;
    }

    public Map<String, Object> getInputs() {
        return inputs;
    }

    public void setInputs(Map<String, Object> inputs) {
        this.inputs = inputs;
    }

    public String getResponseMode() {
        return responseMode;
    }

    public void setResponseMode(String responseMode) {
        this.responseMode = responseMode;
    }

    public String getUser() {
        return user;
    }

    public void setUser(String user) {
        this.user = user;
    }

    public String getConversationId() {
        return conversationId;
    }

    public void setConversationId(String conversationId) {
        this.conversationId = conversationId;
    }

    public List<FileInfo> getFiles() {
        return files;
    }

    public void setFiles(List<FileInfo> files) {
        this.files = files;
    }

    public Boolean getAutoGenerateName() {
        return autoGenerateName;
    }

    public void setAutoGenerateName(Boolean autoGenerateName) {
        this.autoGenerateName = autoGenerateName;
    }

    /**
     * 文件信息内部类
     * 用于描述用户上传的文件信息
     */
    public static class FileInfo {

        /**
         * 文件类型（如：image、document等）
         */
        private String type;

        /**
         * 传输方式
         * "remote_url" - 通过URL传输
         * "local_file" - 本地文件上传
         */
        @JsonProperty("transfer_method")
        private String transferMethod;

        /**
         * 文件URL（当传输方式为remote_url时使用）
         */
        private String url;

        /**
         * 上传文件ID（当传输方式为local_file时使用）
         */
        @JsonProperty("upload_file_id")
        private String uploadFileId;

        // ========== FileInfo 的 Getter 和 Setter 方法 ==========

        public String getType() {
            return type;
        }

        public void setType(String type) {
            this.type = type;
        }

        public String getTransferMethod() {
            return transferMethod;
        }

        public void setTransferMethod(String transferMethod) {
            this.transferMethod = transferMethod;
        }

        public String getUrl() {
            return url;
        }

        public void setUrl(String url) {
            this.url = url;
        }

        public String getUploadFileId() {
            return uploadFileId;
        }

        public void setUploadFileId(String uploadFileId) {
            this.uploadFileId = uploadFileId;
        }
    }
}